package com.simple.core.controller;

import com.simple.annotation.log.SysLog;
import com.simple.core.dto.PageDto;
import com.simple.core.dto.Response;
import com.simple.core.service.IService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.io.Serializable;
import java.util.List;

/**
 * 接口控制器 基础类
 *
 * @author FanXing
 * @date 2022年11月17日 9:19
 */
public abstract class BaseController<T, S extends IService<T>> implements IController<T> {
    @Autowired
    protected S service;

    @Override
//    @SysLog(expression = "分页查询，查询参数：{{ T(cn.hutool.json.JSONUtil).parseObj(#t, true).toString() }}")
    @ApiOperation("分页查询")
    @GetMapping("/page")
    public Response<PageDto<T>> page(T t, PageDto<T> pageDto) {
        return Response.ok(defaultPage(t, pageDto));
    }

    @Override
//    @SysLog(expression = "Feed流查询，查询参数：{{ T(cn.hutool.json.JSONUtil).parseObj(#t, true).toString() }}")
    @ApiOperation("Feed流查询")
    @GetMapping("/slice")
    public Response<PageDto<T>> slice(T t, PageDto<T> pageDto) {
        return Response.ok(defaultSlice(t, pageDto));
    }

    @Override
//    @SysLog(expression = "详情，参数：{ id : {{ #id }} }")
    @ApiOperation("详情")
    @GetMapping("/{id}")
    public Response<T> get(@PathVariable("id") Serializable id) {
        return Response.ok(defaultGet(id));
    }

    @Override
    @SysLog(expression = "新增，参数：{ id : {{ #t.id }} }")
    @ApiOperation("新增")
    @PostMapping
    public Response<Boolean> add(@RequestBody T t) {
        return Response.ok(defaultAdd(t));
    }

    @Override
    @SysLog(expression = "更新，参数：{ id : {{ #t.id }} }")
    @ApiOperation("更新")
    @PutMapping
    public Response<Boolean> update(@RequestBody T t) {
        return Response.ok(defaultUpdate(t));
    }

    @Override
    @SysLog(expression = "批量删除，参数：{ ids : {{ #ids }} }")
    @ApiOperation("批量删除")
    @DeleteMapping
    public Response<Boolean> delete(@RequestParam List<Serializable> ids) {
        return Response.ok(defaultDelete(ids));
    }

    protected PageDto<T> defaultPage(T t, PageDto<T> pageDto) {
        return service.page(t, pageDto);
    }

    protected PageDto<T> defaultSlice(T t, PageDto<T> pageDto) {
        return service.slice(t, pageDto);
    }

    protected T defaultGet(Serializable id) {
        return service.findById(id).orElse(null);
    }

    protected Boolean defaultAdd(T t) {
        return service.add(t);
    }

    protected Boolean defaultUpdate(T t) {
        return service.update(t);
    }

    protected Boolean defaultDelete(List<Serializable> ids) {
        return service.deleteAllById(ids);
    }

}
